package com.youlai.jdk;

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * Java10新增特性
 * var关键字：局部变量类型推断,允许在局部变量声明中使用var关键字来推断变量类型
 * 垃圾收集器接口：为垃圾收集器提供了一个标准的接口，使得开发人员可以更容易地实现自己的垃圾收集器。
 * 改进了Optional类:Optional类添加了一些新方法，例如orElseThrow，or(),ifPresentOrElse()
 * 引入了G1垃圾收集器：G1是一个新的垃圾收集器，它可以在多个CPU内核上并行工作，从而提高了垃圾收集的效率。
 * 引入了基于时间的版本发布：Java SE 10和以后的版本将使用基于时间的版本发布，而不是基于功能的版本发布。
 * @author zc
 * @date 2023-03-25 19:19
 */
public class Java10 {
    /**
     * var关键字：局部变量类型推断,允许在局部变量声明中使用var关键字来推断变量类型
     */
    @Test
    public void var() {
        var message = "Hello, World!";
        System.out.println(message);
    }

    /**
     * 垃圾收集器接口：为垃圾收集器提供了一个标准的接口，使得开发人员可以更容易地实现自己的垃圾收集器。
     */
    @Test
    public void gc() {
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 1000000; i++) {
            list.add("Youlai" + i);
        }
        System.out.println("list size: " + list.size());
        System.gc();
        System.out.println("list size after gc: " + list.size());
    }

    /**
     * 如果Optional对象包含一个非空值，则返回该值，否则抛出一个指定的异常
     */
    @Test
    public void orElseThrow() {
        Optional<String> optional = Optional.ofNullable("Hello World");
        String str = optional.orElseThrow(IllegalArgumentException::new);
        System.out.println(str); // 输出：Hello World
        Optional<String> emptyOptional = Optional.empty();
        emptyOptional.orElseThrow(IllegalArgumentException::new); // 抛出IllegalArgumentException异常
    }

    /**
     * 如果Optional对象包含一个非空值，则返回该值，否则返回一个指定的备用值。
     */
    @Test
    private void or() {
        Optional<String> optional = Optional.ofNullable("Hello World");
        String str = String.valueOf(optional.or(() -> Optional.of("Backup Value")));
        System.out.println(str); // 输出：Hello World
        Optional<String> emptyOptional = Optional.empty();
        String backupValue = String.valueOf(emptyOptional.or(() -> Optional.of("Backup Value")));
        System.out.println(backupValue); // 输出：Backup Value
    }

    /**
     * 如果Optional对象包含一个非空值，则执行指定的操作，否则执行另一个操作
     */
    @Test
    public void ifPresentOrElse() {
        Optional<String> optional = Optional.ofNullable("Hello World");
        optional.ifPresentOrElse(
                value -> System.out.println("Value is present: " + value),
                () -> System.out.println("Value is not present")
        ); // 输出：Value is present: Hello World
        Optional<String> emptyOptional = Optional.empty();
        emptyOptional.ifPresentOrElse(
                value -> System.out.println("Value is present: " + value),
                () -> System.out.println("Value is not present")
        ); // 输出：Value is not present
    }

    /**
     * java10改进的Stream API
     */
    @Test
    public void stream() {
        // 1. takeWhile()方法
        // takeWhile()方法返回一个包含原始流中从开头开始的连续元素的流，直到遇到第一个不满足谓词的元素为止。

        // 2. dropWhile()方法
        // dropWhile()方法返回一个包含原始流中从第一个不满足谓词的元素开始的所有元素的流。
        // 3. ofNullable()方法
        // ofNullable()方法返回一个只包含非空值的流，如果指定的值为null，则返回一个空流。
    }
}
